package org.ssg.dataway.module;

import lombok.extern.slf4j.Slf4j;
import net.hasor.dataway.spi.ApiInfo;
import net.hasor.dataway.spi.PreExecuteChainSpi;
import net.hasor.dataway.spi.ResultProcessChainSpi;
import net.hasor.dataway.spi.StatusMessageException;
import net.hasor.utils.future.BasicFuture;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 *
 * @Description dataway前置处理事件
 *
 *
 */
@Slf4j
@Component
public class DayaWayPreExecuteChainSpi implements PreExecuteChainSpi, ResultProcessChainSpi {

    private final Map<String,Object> cacheMap = new HashMap<>();

    @Override
    public void preExecute(ApiInfo apiInfo, BasicFuture<Object> future) {
        // 每个接口加入固定参数
        apiInfo.getParameterMap().put("self", "me");
        //参数
        Map<String, Object> parameterMap = apiInfo.getParameterMap();
        log.info("前置事件请求参数："+parameterMap);
        String apiPath = apiInfo.getApiPath();//获取url
        log.info("前置事件请求地址："+apiPath);
        // 设置缓存，就不会去查数据库了。completed方法可以返回预先设置好的数据
//         future.completed(parameterMap);
        // 是admin接口，就没有权限。抛异常
        if (apiPath.indexOf("admin")>-1) {
            // （方式1）通过 future 设置异常信息
            future.failed(new StatusMessageException(401, "not power"));
            // （方式2）或者直接 throw 一个异常
            throw new StatusMessageException(401, "not power");
        }
    }

    @Override
    public Object callAfter(boolean formPre, ApiInfo apiInfo, Object result) {
        // formPre 为 true，表示 preExecute 已经处理过。
        // apiInfo.isPerform() 为 true 表示，API 调用是从 UI 界面发起的。
        System.out.println("后置事件preExecute 已经处理过："+formPre);
        System.out.println("后置事件API 调用是从 UI 界面发起的："+apiInfo.isPerform());
        if (formPre || apiInfo.isPerform()) {
            return result;
        }
        //
        String cacheKey = "test";
        this.cacheMap.put(cacheKey, result);
        return result;
    }

    /**
     * 4.如果出现异常怎么做
     *
     */
    @Override
    public Object callError(boolean formPre, ApiInfo apiInfo, Throwable e) {
        return ResultProcessChainSpi.super.callError(formPre, apiInfo, e);
    }
}